//
// Created by 刘洋 on 2024/2/2.
//

#ifndef FOC1_FOC_H
#define FOC1_FOC_H
#include "math.h"
#include "stm32f1xx.h"
#include "retarget.h"
#define PI 3.14159265359
//初始变量及函数定义
#define _constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
//宏定义实现的一个约束函数,用于限制一个值的范围。
//具体来说，该宏定义的名称为 _constrain，接受三个参数 amt、low 和 high，分别表示要限制的值、最小值和最大值。该宏定义的实现使用了三元运算符，根据 amt 是否小于 low 或大于 high，返回其中的最大或最小值，或者返回原值。
//换句话说，如果 amt 小于 low，则返回 low；如果 amt 大于 high，则返回 high；否则返回 amt。这样，_constrain(amt, low, high) 就会将 amt 约束在 [low, high] 的范围内。


/**
 * 将角度归一化处理，角度限制在【0，2pi】
 * @param angle
 * @return
 */
float _normalizeAngle(float angle);
/**
 * 进行帕克逆变换，克拉克逆变换
 * @param Uq
 * @param Ud
 * @param angle_el
 */
void setPhaseVoltage(float Uq,float Ud, float angle_el);
//获取us为单位的时间函数
__STATIC_INLINE uint32_t GXT_SYSTICK_IsActiveCounterFlag()
{
    return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
}
static uint32_t getCurrentMicros(void)
{
    /* Ensure COUNTFLAG is reset by reading SysTick control and status register */
    GXT_SYSTICK_IsActiveCounterFlag();
    uint32_t m = HAL_GetTick();
    const uint32_t tms = SysTick->LOAD + 1;
    __IO uint32_t u = tms - SysTick->VAL;
    if (GXT_SYSTICK_IsActiveCounterFlag()) {
        m = HAL_GetTick();
        u = tms - SysTick->VAL;
    }
    return (m * 1000 + (u * 1000) / tms);
}
//获取系统时间，单位us
uint32_t micros(void);
/**
 * 求解电角度 = 機械角*極對數
 * @param shaft_angle
 * @param pole_pairs
 * @return
 */
float _electricalAngle(float shaft_angle, int pole_pairs);

void setPWM(float Ua,float Ub,float Uc);
#endif //FOC1_FOC_H
